# Flask + Pytest

Учебное приложение: API с использованием Flask, SQLAlchemy, Flask-SQLAlchemy, Pytest, `pytest-cov`, Factory Boy.

## Структура директорий

- 📁 **app**
  - 📄 `__init__.py`: фабричная функция `create_app()` для создания инстанса приложения Flask.
  - 📄 *clients.py*: роуты для работы с клиентами.
  - 📄 *parkings.py*: роуты для работы с парковками.
  - 📄 *client_parking.py*: роуты для работы с логами событий парковки.
- 📁 **data**: слой данных
  - 📄 *models.py*: модели таблиц SQLAlchemy.
  - 📄 *clients.py*: функции для работы с данными о клиентах в БД.
  - 📄 *parkings.py*: функции для работы с данными о парковках в БД.
  - 📄 *client_parking.py*: функции для работы с данными о событиях парковки в БД.
- 📁 **fake_data**: "поддельный" слой данных, используется в юнит-тестах сервисного слоя. Имитирует функции из пакета 
  `data`.
- 📁 **service**: сервисный слой – бизнес-логика приложения
  - 📄 *clients.py*: сервисные функции для работы с клиентами.
  - 📄 *parkings.py*: сервисные функции для работы с парковками.
  - 📄 *client_parking.py*: основная бизнес-логика приложения тут – сервисные функции создания событий 
    парковки и выезда с парковки.
- 📁 **tests**
  - 📁 **integration**: интеграционные тесты API.
  - 📁 **unit**: юнит-тесты.
    - 📁 **data**: юнит-тесты слоя данных.
    - 📁 **service**: изолированные юнит-тесты сервисного слоя, проверяют работу бизнес-логики независимо от БД.
    - 📁 **web**: изолированные юнит-тесты API endpoints.
- 📄 *database.py*: инициализация БД.
- 📄 *errors.py*: кастомные исключения для обработки ошибок.
- 📄 *main.py*: входная точка приложения.

## Запуск приложения

```bash
python src/main.py
# или
docker compose up -d --build
```

### Запуск тестов

```bash
pytest -v
# или
docker compose exec web pytest -v

# With coverage:
pytest -v --cov

# Coverage with HTML report (in ./htmlcov/ directory):
pytest -v --cov --cov-report html
```
Покрытие тестами: 100%.

![Coverage Report](./images/covreport.png)

## References

- [The Application Factory – Flask Docs](https://flask.palletsprojects.com/en/3.0.x/tutorial/factory/#the-application-factory)
- [Blueprints and Views – Flask Docs](https://flask.palletsprojects.com/en/3.0.x/tutorial/views/)
- [Flask-SQLAlchemy Documentation](https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/)
- [Factory Boy Documentation](https://factoryboy.readthedocs.io/en/stable/index.html)
